﻿#pragma once
#include <QVector>
#include <QObject>

#include "ADFGlobal.h"
/************************************************************************/
/*                              任务类                                  */
/************************************************************************/
class AsCoreProcess;
class ADF_EXPORT AsTask : public QObject 
{
public:
	AsTask();
	virtual ~AsTask();

private:
	int								m_iStatus;		//任务状态
	int								m_iTimeout;		//等待时长
	QVector<AsTask*>				m_vPreTask;		//前置任务
	QVector<AsTask*>				m_vBranchTask;	//添加分支任务
	AsCoreProcess*					m_pProcess;		//任务所在流程

private:
	int waitForPreTasks();							//等待前置任务	
	void startBranchTasks();						//开启分支任务	

protected:
	QString m_qsType;

protected:
	bool isProcessRunning();									//判断流程是否在运行
	inline AsCoreProcess* getProcess() { return m_pProcess; }	//获取Process
	virtual void beforeTask();									//任务前操作
	virtual int onTaskAction() = 0;								//任务完成实现
	virtual void afterTask();									//任务后操作
	virtual void onResetTaskStatus() {};						//重置任务状态，有递归或衍生任务时，要重载此方法

public:
	int doTask();
	bool isFinished();											//是否完成
	bool isRunning();											//是否正在运行
	void resetTaskStatus();										//重置任务状态
	void addPreTask(AsTask* pTask);								//添加前置任务
	void addBranchTask(AsTask* pTask);							//添加分支任务
	void addBranchTask(AsTask* pTask,AsTask* pJoinTask);		//添加分支任务
	void setTimeout(int timeout);								//设置超时时间，单位ms
	virtual void setProcess(AsCoreProcess* pProcess);			//设置任务所在流程
	QString getTaskType();										//获取任务名称

};
